1 package uba.db.sql.language;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.Iterator;
6 import java.util.List;
7
8 import org.apache.commons.lang.builder.EqualsBuilder;
9 import org.apache.commons.lang.builder.HashCodeBuilder;
10
11 /***
12 * @version $Revision: 1.5 $
13 */
14 public class DisplayMultipleColumns implements DisplayColumns {
15 private List columns;
16
17 /***
18 * Crea una nueva instancia compuesta de solo dos columnas.
19 *
20 * @param column
21 * una columna individual.
22 * @param otherColumn
23 * otra columna individual.
24 */
25 public DisplayMultipleColumns(DisplayColumns column, DisplayColumns otherColumn) {
26 columns = new ArrayList();
27 columns.add(column);
28 columns.add(otherColumn);
29 }
30
31 /***
32 * Crea una instancia compuesta de una lista de columnas.
33 *
34 * @param columns
35 * una lista de {@link DisplayColumns}
36 */
37 public DisplayMultipleColumns(List columns) {
38 this.columns = columns;
39 }
40
41 /***
42 * @see uba.db.sql.language.DisplayColumns#append(uba.db.sql.language.DisplayColumns)
43 */
44 public DisplayColumns append(DisplayColumns other) {
45 return other.appendTo(this);
46 }
47
48 private DisplayColumns appendAfter(DisplayColumns oneColumn) {
49 List newDisplayColumns = new ArrayList();
50 newDisplayColumns.add(oneColumn);
51 newDisplayColumns.addAll(columns);
52 return new DisplayMultipleColumns(newDisplayColumns);
53 }
54
55 /***
56 * Agrega una instancia de {@link DisplayColumns} como si fuese una sola
57 * columna luego de las columnas que contiene esta clase.
58 *
59 * @param column
60 * la columna a agregar.
61 *
62 * @return una nueva instancia de {@link DisplayMultipleColumns} con las
63 * columnas que contiene esta instancia y la columna agregada.
64 */
65 public DisplayColumns appendAsOne(DisplayColumns column) {
66 List newDisplayColumns = new ArrayList(columns);
67 newDisplayColumns.add(column);
68
69 return new DisplayMultipleColumns(newDisplayColumns);
70 }
71
72 /***
73 * @see uba.db.sql.language.DisplayColumns#appendTo(uba.db.sql.language.DisplayAllColumns)
74 */
75 public DisplayColumns appendTo(DisplayAllColumns allColumns) {
76 return appendAfter(allColumns);
77 }
78
79 /***
80 * @see uba.db.sql.language.DisplayColumns#appendTo(uba.db.sql.language.DisplayMultipleColumns)
81 */
82 public DisplayColumns appendTo(DisplayMultipleColumns otherDisplayMultipleColumns) {
83 List newDisplayColumns = new ArrayList(otherDisplayMultipleColumns.columns);
84 newDisplayColumns.addAll(this.columns);
85
86 return new DisplayMultipleColumns(newDisplayColumns);
87 }
88
89 /***
90 * @see uba.db.sql.language.DisplayColumns#appendTo(uba.db.sql.language.DisplayOneColumn)
91 */
92 public DisplayColumns appendTo(DisplayOneColumn oneColumn) {
93 return appendAfter(oneColumn);
94 }
95
96 /***
97 * @see java.lang.Object#equals(java.lang.Object)
98 */
99 public boolean equals(Object obj) {
100 return EqualsBuilder.reflectionEquals(this, obj);
101 }
102
103 /***
104 * @see java.lang.Object#hashCode()
105 */
106 public int hashCode() {
107 return HashCodeBuilder.reflectionHashCode(this);
108 }
109
110 /***
111 * @see java.lang.Object#toString()
112 */
113 public String toString() {
114 StringBuffer buffer = new StringBuffer();
115 Iterator iterator = columns.iterator();
116 while (iterator.hasNext()) {
117 buffer.append(iterator.next());
118 if (iterator.hasNext()) {
119 buffer.append(", ");
120 }
121 }
122
123 return buffer.toString();
124 }
125
126 /***
127 * @see uba.db.sql.language.Visitable#accept(uba.db.sql.language.Visitor)
128 */
129 public void accept(Visitor visitor) {
130 visitor.visitDisplayMultipleColumns(this);
131 }
132
133 /***
134 * Retorna todos las instancias de {@link DisplayColumns} contenidas.
135 */
136 public List columns() {
137 return Collections.unmodifiableList(columns);
138 }
139 }